#include "seg.h"
#include "delay.h"
#include "tim.h"
// 全局变量定义
uint8_t seg_value = 23;              // 初始显示23
SegState seg_power = SEG_OFF;        // 初始关闭

// 共阴极段码表（0-9，16为全灭）
static const uint8_t seg_table[17] = {
    0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 
    0x7F, 0x6F, 0x77, 0x7C, 0x39, 0x5E, 0x79, 0x71, 0x00
};

// 存储要显示的每位数字（十位和个位）
static uint8_t show_data[SEG_DIGITS] = {2, 3};  // 初始23

// 中断中使用的扫描变量（仅前两位）
static int8_t scan_pos = 0;

// 更新显示缓存
static void update_show_data(void) {
    show_data[0] = seg_value / 10;  // 十位
    show_data[1] = seg_value % 10;  // 个位
}

// 数码管初始化
void Seg_Init(void) {
    Seg_Off();  // 初始关闭显示
}

// 数码管刷新函数（核心显示逻辑）
void Seg_Update(void) {
    if (seg_power == SEG_OFF) {
        // 关闭状态：输出全灭段码
        HAL_GPIO_WritePin(HC595_LCLK_GPIO_Port, HC595_LCLK_Pin, GPIO_PIN_RESET);
        for (int j = 7; j >= 0; j--) {
            HAL_GPIO_WritePin(HC595_SCLK_GPIO_Port, HC595_SCLK_Pin, GPIO_PIN_RESET);
            HAL_GPIO_WritePin(HC595_DATA_GPIO_Port, HC595_DATA_Pin, GPIO_PIN_RESET);
            HAL_GPIO_WritePin(HC595_SCLK_GPIO_Port, HC595_SCLK_Pin, GPIO_PIN_SET);
        }
        HAL_GPIO_WritePin(HC595_LCLK_GPIO_Port, HC595_LCLK_Pin, GPIO_PIN_SET);
        return;
    }

    update_show_data();  // 同步显示数据

    // 段选：发送当前位置的段码
    HAL_GPIO_WritePin(HC595_LCLK_GPIO_Port, HC595_LCLK_Pin, GPIO_PIN_RESET);
    for (int j = 7; j >= 0; j--) {
        HAL_GPIO_WritePin(HC595_SCLK_GPIO_Port, HC595_SCLK_Pin, GPIO_PIN_RESET);
        
        if ((seg_table[show_data[scan_pos]] >> j) & 1) {
            HAL_GPIO_WritePin(HC595_DATA_GPIO_Port, HC595_DATA_Pin, GPIO_PIN_SET);
        } else {
            HAL_GPIO_WritePin(HC595_DATA_GPIO_Port, HC595_DATA_Pin, GPIO_PIN_RESET);
        }
        
        HAL_GPIO_WritePin(HC595_SCLK_GPIO_Port, HC595_SCLK_Pin, GPIO_PIN_SET);
    }
    HAL_GPIO_WritePin(HC595_LCLK_GPIO_Port, HC595_LCLK_Pin, GPIO_PIN_SET);

    
    HAL_GPIO_WritePin(HC138_A1_GPIO_Port, HC138_A1_Pin, (scan_pos >> 1) & 1);
    HAL_GPIO_WritePin(HC138_A0_GPIO_Port, HC138_A0_Pin, scan_pos & 1);

    // 循环扫描
    scan_pos = (scan_pos + 1) % SEG_DIGITS;
}

// 数码管模块的定时器中断回调（仅响应TIM3）
void Seg_TIM_Callback(TIM_HandleTypeDef *htim) {
    if (htim == &htim3) {  // 明确使用TIM3作为数码管刷新中断
        Seg_Update();
    }
}

// 数值调整函数（保持不变）
void Seg_Add(void) {
    if (seg_power == SEG_ON && seg_value < MAX_TEMP) {
        seg_value++;
    }
}

void Seg_Del(void) {
    if (seg_power == SEG_ON && seg_value > MIN_TEMP) {
        seg_value--;
    }
}

void Seg_On(void) {
    seg_power = SEG_ON;
}

void Seg_Off(void) {
    seg_power = SEG_OFF;
}


